package app.controllers;

import app.models.SubEspecialidade;
import app.services.ConvenioService;
import app.services.EspecialidadeService;
import app.services.LogService;
import app.services.SubEspecialidadeService;
import app.util.Constants;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.validator.ValidationMessage;

@Resource
public class SubEspecialidadeController extends Controller{

	private final Result result;
	private final SubEspecialidadeService service;
	private final Validator validator;
	private final EspecialidadeService especialidadeService;
	private final ConvenioService convenioService;
	private final LogService logService;
	
	public SubEspecialidadeController(Result result,
			SubEspecialidadeService service, Validator validator, EspecialidadeService especialidadeService,
			ConvenioService convenioService, LogService logService) {

		this.result = result;
		this.service = service;
		this.validator = validator;
		this.especialidadeService = especialidadeService;
		this.convenioService = convenioService;
		this.logService = logService;
	}
	
	@Get("/subEspecialidades")
	public void index() {
		result.include("subEspecialidades", service.findAllOrdered());
		result.include("ultimasSubEspecialidades", service.findLastSubEspecialidades());
	}

	@Get("/subEspecialidades/new")
	public void form() {
		result.include("convenios", convenioService.findAll());
		result.include("especialidades", especialidadeService.findAll());
	}

	@Post("/subEspecialidades/save")
	public void save(SubEspecialidade subEspecialidade) {
		
		subEspecialidade = service.calculateSubEspecialidadeValue(subEspecialidade);
		
		if(subEspecialidade.getCh() == null){
			validator.add(new ValidationMessage(bundle.getString("chForEspecialidade.empty"), Constants.ERROR));
		}
		
		validator.validate(subEspecialidade);
		validator.onErrorForwardTo(this).form();
		
		service.create(subEspecialidade);
		
		logService.createLog(Constants.NEW_SUB_ESPECIALIDADE + subEspecialidade.getId());
		
		result.forwardTo(this).index();
	}
	
	@Get("/subEspecialidades/{id}/edit")
	public void edit(Long id) {
		result.include("convenios", convenioService.findAll());
		result.include("especialidades", especialidadeService.findAll());
		result.include("subEspecialidade", service.find(id));
	}
	
	@Post("/subEspecialidades/update")
	public void update(SubEspecialidade subEspecialidade) {
		
		subEspecialidade = service.calculateSubEspecialidadeValue(subEspecialidade);
		
		if(subEspecialidade.getCh() == null){
			validator.add(new ValidationMessage(bundle.getString("chForEspecialidade.empty"), Constants.ERROR));
		}
		
		validator.validate(subEspecialidade);
		
		validator.onErrorForwardTo(this).edit(subEspecialidade.getId());
		service.update(subEspecialidade);
		
		logService.createLog(Constants.UPDATE_SUB_ESPECIALIDADE + subEspecialidade.getId());
		
		result.forwardTo(this).index();
	}
	
	@Get("/subEspecialidades/{id}/show")
	public void show(Long id) {
		result.include("subEspecialidade", service.find(id));
	}
	
}
